Overview
CDL supports a number of event operators (also referred to as event propagators), but the most commonly used are collection, multiplexing, and distribution.
Collection and Non-Blocking Execution
Collector objects consume an arbitrary number of provided events and then provide their consumers with a compound event which contains the whole collection. Collection is fundamental to CDL and is an asynchronous operation. In particular, it optimally reduces communication latency because requests are automatically issued well ahead of their availability. Compound events can be separated back into their constituent parts by the reciprocal 'Splitter' object (see Splitting Compound Collected Events).
Distribution and Managing Data Lifetime
Distributors asynchronously request from their providers and then propagate to each connected consumer. When all consumers have finished with the event (all issued a close) then the distributor's provided event is closed (which then closes it's provided events, and so on). It is not always the case that program logic requires events to be just shared. In some cases the reciprocal 'competer' object is required so that a sub-group of consumers can compete for shareable events (see Competing for a Distributed Event).
Multiplexing, Overloading and Shared State
Multiplexors also allow a consumer to asynchronously request from multiple providers but in this case, each provided event is propagated on receipt rather than waiting for every event to arrive. Multiplexors have similar properties to a UNIX style 'Select', or a Windows 'WaitForMultipleObjects'. Again, there is a reciprocal operator; a demultiplexer, that allows particular events to be suitably routed (see Demultiplexing Compound Multiplexed Events).